package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"strconv"
	"strings"
	"time"
)

// 比较上次获取token是否失效 获取有效token更新全局
// 接口返回有效值是7200秒，但因有其他调用，而多次调用以第一次计时，且值不变，我们只保留10分钟有效性减少容错率
func validToken(t *Token) (err error) {

	if t.AccessToken == "" || (time.Now().Unix()-t.createTime.Unix()) > t.ExpiresIn {
		n, err := getAccessToken()
		if err != nil {
			fmt.Printf("效验token有效性时获取tokne出错 %v\n", err)
			return err
		}
		t.createTime = n.createTime
		t.AccessToken = n.AccessToken
		// 原返回7200 ，我们只保留10分钟
		t.ExpiresIn = n.ExpiresIn - 6600
	} else {
		fmt.Printf("token有效时长还剩余 %d 秒\n", t.ExpiresIn-(time.Now().Unix()-t.createTime.Unix()))
	}
	return
}

// 发送企业微信应用消息
func sendWechatAppMsg(a []Alert, token string) (err error) {
	url := fmt.Sprintf("%s?access_token=%s", configMap["qywechat"]["sendmsgurl"], token)
	// 表单数据
	//contentType := "application/x-www-form-urlencoded"
	//data := "name=小王子&age=18"
	// json
	agentid, _ := strconv.ParseInt(configMap["qywechat"]["agentid"], 10, 64)
	contentType := "application/json"
	data := fmt.Sprintf(
		`{
		"touser" : "%s",
		"msgtype" : "text",
		"agentid" : %d,
		"text" : {
			"content" : "%s"
			}
		}`,
		processToUser(configMap["qywechat"]["touser"]),
		agentid,
		processAlertToJsonStr(a))

	resp, err := http.Post(url, contentType, strings.NewReader(data))
	if err != nil {
		fmt.Printf("post failed, err:%v\n", err)
		return
	}
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("get resp failed, err:%v\n", err)
		return
	}
	// fmt.Println(data)
	// fmt.Println(string(b))
	var resVal map[string]interface{}
	_ = json.Unmarshal(b, &resVal)
	resCode, _ := resVal["errcode"].(int64)
	if resCode != 0 {
		err = fmt.Errorf("发送消息失败, 返回结果: %s", string(b))
		return
	}
	return
}

//企业微信接口，通过应用推送消息
func qyWechatHandler(w http.ResponseWriter, r *http.Request) {
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		fmt.Println(err)
		return
	}
	alert, err := processRequest(body)
	if err != nil {
		fmt.Println(err)
		return
	}
	// fmt.Println(alert.startsAt.Format("2006-01-02 15:04:05"))
	// fmt.Println(alert.endsAt.Format("2006-01-02 15:04:05"))
	validToken(&accessToken)
	err = sendWechatAppMsg(alert, accessToken.AccessToken)
	if err != nil {
		fmt.Println(err)
		fmt.Fprintf(w, "企业微信发送失败%v", err)
		return
	}
	if configMap["globals"]["mysql"] == "on" {
		for _, a := range alert {
			err = insertRow(a, "企业微信")
			if err != nil {
				fmt.Println(err)
				fmt.Fprintf(w, "邮件发送记录入库失败%v", err)
				return
			}
		}
	}

}
